package changgou.pay.service.impl;

import changgou.pay.service.WeiXinPayService;
import com.alibaba.fastjson.JSON;
import com.github.wxpay.sdk.WXPayUtil;
import entity.HttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.HashMap;
import java.util.Map;

@Service
public class WeiXinPayServiceImpl implements WeiXinPayService {
    @Value("${weixin.appid}")
    private String appid;  //应用id
    @Value("${weixin.partner}")
    private String partner;  //商户id
    @Value("${weixin.partnerkey}")
    private String partnerkey;   //密钥
    @Value("${weixin.notifyurl}")
    private String notifyurl;  //支付回调地址
    /**
     * 获取二维码
     * @param parameteMap
     * @return
     */
    @Override
    public Map createnative(Map<String, String> parameteMap) {
        try {
            //参数
            Map<String,String> paramMap = new HashMap<>();
            paramMap.put("appid",appid);  //公众账号ID
            paramMap.put("mch_id",partner); // 商户号
            String str =WXPayUtil.generateNonceStr();
            paramMap.put("nonce_str", str);   // 随机字符串
            paramMap.put("body","畅购商城订单");   //商品描述
            paramMap.put("out_trade_no",parameteMap.get("outtradeno"));   //订单号  传过来，不写死
            paramMap.put("total_fee",parameteMap.get("totalfee")); //交易金额  分
            paramMap.put("spbill_create_ip","192.168.0.104");  //终端IP
            paramMap.put("notify_url",notifyurl);  //通知地址
            paramMap.put("trade_type","NATIVE"); // 交易类型

            //获取自定义数据  传给微信的自定义数据
            String exchange = parameteMap.get("exchange");
            String routingkey = parameteMap.get("routingkey");
            Map<String, String> attachMap = new HashMap<>();
            attachMap.put("exchange",exchange);
            attachMap.put("routingkey",routingkey);
            //如果是秒杀支付，需要传username
            String username = parameteMap.get("username");
            if (!StringUtils.isEmpty(username)){
                attachMap.put("username",username);
            }
            String attach = JSON.toJSONString(attachMap);
            paramMap.put("attach",attach);

            // 签名  在转化xml的时候携带签名
            String signedXml = WXPayUtil.generateSignedXml(paramMap, partnerkey);

            //URL地址   腾讯给的地址，复制过来即可
            String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
            //利用HTTPclient 发接数据
            HttpClient httpClient = new HttpClient(url);
            //1,提交方式
            httpClient.setHttps(true);
            //2,提交参数
            httpClient.setXmlParam(signedXml);
            //3,执行请求
            httpClient.post();
            //4，接收返回数据 并且转化为map。
            String content = httpClient.getContent();
            //转化
            Map<String, String> map = WXPayUtil.xmlToMap(content);

            return map;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /***
     *  支付状态查询
     * @param outtradeno
     * @return
     */
    @Override
    public Map queryStatus(String outtradeno) {
        try {
            //参数
            Map<String,String> paramMap = new HashMap<>();
            paramMap.put("appid",appid);  //公众账号ID
            paramMap.put("mch_id",partner); // 商户号
            String str =WXPayUtil.generateNonceStr();
            paramMap.put("nonce_str", str);   // 随机字符串
            paramMap.put("out_trade_no",outtradeno);   //订单号  传过来，不写死

            // 签名  在转化xml的时候携带签名
            String signedXml = WXPayUtil.generateSignedXml(paramMap, partnerkey);

            //URL地址   腾讯给的地址，复制过来即可
            String url = "https://api.mch.weixin.qq.com/pay/orderquery";
            //利用HTTPclient 发接数据
            HttpClient httpClient = new HttpClient(url);
            //1,提交方式
            httpClient.setHttps(true);
            //2,提交参数
            httpClient.setXmlParam(signedXml);
            //3,执行请求
            httpClient.post();
            //4，接收返回数据 并且转化为map。
            String content = httpClient.getContent();
            //转化
            Map<String, String> map = WXPayUtil.xmlToMap(content);

            return map;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    }
